class: inverse,left, middle background-image: url(data:image/png;base64,#background.png) background-size: cover <img src="data:image/png;base64,#LOGO_DIPLOMADO.png" width="500px"/> ##Módulo 5: Manejo de datos climáticos avanzados ### Tipo de datos climáticos MatÃas Olea <br> <a href="https://orcid.org/0000-0003-0194-7784"> ORCID </a><br> matias.olea@pucv.cl</a><br> .large[<b><a href="https://www.pucv.cl/uuaa/site/edic/base/port/labgrs.html">LabGRS</a> | Abril 2025</b>] <br> --- <center> <img src="data:image/png;base64,#Contenidos.png" width="900px"/> </center> --- ## Contenidos .pull-left[ 1) Tipos de datos climáticos. 2) Datos climáticos ráster. 3) Operaciones sobre un ráster. 4) Extracción de información desde un ráster. ] .pull-right[ <img src="data:image/png;base64,#https://raw.githubusercontent.com/allisonhorst/stats-illustrations/main/rstats-artwork/r_rollercoaster.png" width="650px"/> ] --- ### Tipos de datos climáticos - **Informes**: informes meteorológicos antiguos que contienen la información dentro de textos o tablas en las que no se pueden acceder directamente a ellos. Debemos transcribir dicha información a un formato que nos permita manipular. <center> <img src="data:image/png;base64,#Datos_Informes.png" width="625px"/> </center> --- ### Tipos de datos climáticos - **Estaciones meteorológicas**: comunmente podemos acceder a los registros de estos datos a través de un datalogger recuperados directamente desde la estación. El formato de salida dependerá de los protocolos y modelo de la estación. Algunas estaciones envÃa la información via internet movil; comunmente podemos acceder a esta información a través de portales y están almacenadas en formato tabla. Hoy en dÃa podemos encontrar esta información asociada a una coordenada. <center> <img src="data:image/png;base64,#Datos_Estacion.png" width="500px"/> </center> --- ### Tipos de datos climáticos - **Datos puntales**: la fuente de esta información puede ser variada, desde informes, las mismas estaciones o extraidas de otros productos. Esta se caracteriza por contar con escasos datos (por poca recurrencia en su actualización). Esta información está asociada a una coordenada, por lo que podemos visualizar dicha información en un sofware que nos permita manipular información espacial (ArcGIS, QuantumGIS, Surfer, AutoCAD, gvSIG, GRASS, SAGA, etc.) <center> <img src="data:image/png;base64,#Datos_Puntual.png" width="500px"/> </center> --- ### Tipos de datos climáticos .pull-left[ - **Productos grillados**: este tipo de datos corresponde a información espacial almacenada a través de una matriz ráster formada por filas y columnas, cuyas celdas almacenan el valor de una variable meteorológica. Estos productos son obtenidos a través de (a) información satelital, (b) información de modelos creados a partir de estaciones en terreno, (c) o una mezcla entre ambas. ] .pull-right[ <center> <img src="data:image/png;base64,#Datos_Raster.png" width="500px"/> </center> ] --- ## Datos climáticos ráster <center> <img src="data:image/png;base64,#modelo_raster1.png" width="900px"/> </center> --- ## Formatos ráster Los modelos ráster pueden ser almacenados en múltiples formatos, los más comunes son: -- - **GeoTIFF** (Geographical Tagged Image File Format). Fuente de datos en formato Tiff, con la particularidad de que es <u>capaz de almacenar información de referencia espacial</u>. -- - **GMLJP2** (Geographic Markup Language JPEG2000). Muy parecido al formato JPEG pero con <u>mayores beneficios a la hora de comprensión de los datos</u> sin perder información o calidad. -- - **NetCDF** (Network Common Data Form). Fuente de datos creada para el almacenamiento de información cientÃfica en varias dimensiones. Esta fuente de información se asocia principalmente a datos de tipos climáticos o productos satelitales. Su <u>gran capacidad de información</u> la hacen muy útil para compartir grandes volúmenes de información. -- - **HDF** (Hierarchical Data Format). Al igual que el NetCDF, son fuentes creadas para almacenar <u>grandes volúmenes de información</u> cientÃfica espacial. -- - **HGT** Formato asociado a modelo de elevación SRTM (Shuttle Radar Topography Mission Height) <u>caracterizado por almacenar valores enteros positivos y negativos de 2 bits</u>. --- ## Estructura de almacenamiento Por ejemplo si tenemos la información grillada resumen de una decada, o de una fecha en especÃfica, el archivo tendrá solo 1 capa de información (banda o layer), estos archivos se conocen como archivos **monobanda** en terminos de Geoinformática. Por otra, si en un mismo archivo, contamos con 2 o más capas de información, por ejemplo 1 capa por mes (es decir 12 capas en 1 año), denominamos este archivo **multibanda**. <center> <img src="data:image/png;base64,#mono_multi.png" width="450px"/> </center> .footnote[ <span style="font-size:9pt"> * Tener ojo los archivos multibanda no significa siempre que un layer o banda adicional sea siempre tiempo, puede ser cualquier tipo de información. Ej: en el layer 1 podemos tener la elevación del relieve, en el layer 2 la precipitación del año 2023, en el layer 3 la cobertura de uso de suelo, etc. </span> ] --- ## Estructura de almacenamiento <center> <img src="data:image/png;base64,#mono_multi.png" width="800px"/> </center> --- ## Operaciones sobre un raster <center> <img src="data:image/png;base64,#modelo.png" width="700px"/> </center> --- ## Operaciones sobre un raster **Consultas** * _Consulta simple_* * Consulta booleana **Alteración** * Uniones y mosaicos * _Recorte, clip o crop_* * _Máscaras_* * Reclasificación * Remuestreo **Transformación** * Reproyección * Cambio tipo de dato * Vectorización: _isolineas_*, poligonización, a puntos --- ## Operaciones de consulta en R -- ``` r library(terra) library(tidyverse) cr2met_pp <- rast("C:/TuDirectorio/CR2MET_PP_Mensual_1960-2021.tif") plot(cr2met_pp[[1]]) # con doble parantesis indicamos el n° de la banda que queremos plotear ``` <img src="data:image/png;base64,#05_Tipos_datos_climaticos_files/figure-html/unnamed-chunk-2-1.png" width="100%" /> --- ## Operaciones de consulta en R **Clase de objeto** ``` r class(cr2met_pp) ``` ``` ## [1] "SpatRaster" ## attr(,"package") ## [1] "terra" ``` -- **Dimensiones** ``` r c(nrow(cr2met_pp), ncol(cr2met_pp), nlyr(cr2met_pp)) # filas, columnas, bandas ``` ``` ## [1] 70 101 744 ``` -- **Resolución** ``` r res(cr2met_pp) ``` ``` ## [1] 0.05 0.05 ``` --- ## Operaciones de consulta en R **Extensión** ``` r ext(cr2met_pp) ``` ``` ## xmin xmax ymin ymax ## -73.40 -68.35 -34.80 -31.30 ``` --- ## Operaciones de consulta en R **Sistema de referencia y Coordenadas** ``` r crs(cr2met_pp) ``` ``` ## [[1]] ## [1] "GEOGCRS[\"WGS 84\"," ## [2] " ENSEMBLE[\"World Geodetic System 1984 ensemble\"," ## [3] " MEMBER[\"World Geodetic System 1984 (Transit)\"]," ## [4] " MEMBER[\"World Geodetic System 1984 (G730)\"]," ## [5] " MEMBER[\"World Geodetic System 1984 (G873)\"]," ## [6] " MEMBER[\"World Geodetic System 1984 (G1150)\"]," ## [7] " MEMBER[\"World Geodetic System 1984 (G1674)\"]," ## [8] " MEMBER[\"World Geodetic System 1984 (G1762)\"]," ## [9] " MEMBER[\"World Geodetic System 1984 (G2139)\"]," ## [10] " MEMBER[\"World Geodetic System 1984 (G2296)\"]," ## [11] " ELLIPSOID[\"WGS 84\",6378137,298.257223563," ## [12] " LENGTHUNIT[\"metre\",1]]," ## [13] " ENSEMBLEACCURACY[2.0]]," ## [14] " PRIMEM[\"Greenwich\",0," ## [15] " ANGLEUNIT[\"degree\",0.0174532925199433]]," ## [16] " CS[ellipsoidal,2]," ## [17] " AXIS[\"geodetic latitude (Lat)\",north," ## [18] " ORDER[1]," ## [19] " ANGLEUNIT[\"degree\",0.0174532925199433]]," ## [20] " AXIS[\"geodetic longitude (Lon)\",east," ## [21] " ORDER[2]," ## [22] " ANGLEUNIT[\"degree\",0.0174532925199433]]," ## [23] " USAGE[" ## [24] " SCOPE[\"Horizontal component of 3D system.\"]," ## [25] " AREA[\"World.\"]," ## [26] " BBOX[-90,-180,90,180]]," ## [27] " ID[\"EPSG\",4326]]" ``` --- ## Operaciones de consulta en R **Tipo de dato** ``` r datatype(cr2met_pp[[1]]) ``` ``` ## [1] "INT2S" ``` **_Codificación_**
--- ## Operaciones de consulta en R Ahora, esta información que consultamos una por una, la podemos obtener de forma fácil y resumida solo imprimiento nuestro objeto: ``` r cr2met_pp ``` ``` ## class : SpatRaster ## dimensions : 70, 101, 744 (nrow, ncol, nlyr) ## resolution : 0.05, 0.05 (x, y) ## extent : -73.4, -68.35, -34.8, -31.3 (xmin, xmax, ymin, ymax) ## coord. ref. : lon/lat WGS 84 (EPSG:4326) ## source : CR2MET_PP_Mensual_1960-2021.tif ## names : 1960-01-15, 1960-02-15, 1960-03-15, 1960-04-15, 1960-05-15, 1960-06-15, ... ## min values : 0, 0, 0, 0, 0, 6, ... ## max values : 298, 168, 195, 105, 102, 631, ... ``` --- ## Operaciones de alteración **Recorte, Clip o Crop** El recorte signica sustraer parte de la matriz ráster según una extensión definida. Podemos crear una extensión ingresando las <u>coordenas lÃmite</u> (xmin, xmax, ymin, ymax), usando la <u>extensión de un geodato</u>, o <u>dibujando una extensión</u> sobre un plot usando la función **draw()**. <center><img src="data:image/png;base64,#clip.png" width="600px"/></center> --- ## Operaciones de alteración **Recorte, Clip o Crop** ``` r vector_valpo <- vect("C:/TuDirectorio/valpo.gpkg") recorte_PP <- cr2met_pp %>% crop(vector_valpo) plot(recorte_PP[[1]]) plot(vector_valpo, add=T) ``` <img src="data:image/png;base64,#05_Tipos_datos_climaticos_files/figure-html/unnamed-chunk-16-1.png" width="100%" /> --- ## Operaciones de alteración **Máscara o Mask** La aplicación de una máscara o enmascaramiento implica el sustraer los valores de un ráster dentro de los lÃmites de un geodato, reclasificanto los pixeles fuera de estos lÃmites como "No Dato", "not available" o "NA". Se aconseja recortar y enmascarar al área de interes. <center><img src="data:image/png;base64,#mascara.png" width="900px"/></center> --- ## Operaciones de alteración **Máscara o Mask** Un elemento importante a considerar es hacerse la pregunta, ¿Qué ocurre cuando el lÃmite de mi área de interés toca parte del pixel pero no lo cubre por completo? ¿lo incluye o no? Existe un parámetro de tipo lógico dentro la función **mask()** llamado "touches". Cuando touches es **T** si toca el pixel, queda incluido en la máscara, si touches es **F** el pixel debe estar contenido en un 100% dentro del área de interes para ser incluido. <center><img src="data:image/png;base64,#touches.png" width="400px"/></center> --- ## Operaciones de alteración **Máscara o Mask** ``` r mascara_completa <- cr2met_pp %>% mask(vector_valpo) # mascara sin clip mascara_crop <- recorte_PP %>% mask(vector_valpo) # mascara con clip ``` <img src="data:image/png;base64,#05_Tipos_datos_climaticos_files/figure-html/unnamed-chunk-18-1.png" width="100%" /> --- ## Operaciones de transformación **Vectorización: contornos o isolineas** ``` r nivel <- c(5,50,150,300,450,600) # serie de intervalos de isolineas pp_contorno <- as.contour(cr2met_pp[[6]], levels=nivel) # creamos vector de lineas plot(cr2met_pp[[6]]) terra::contour(cr2met_pp[[6]], levels=nivel, add=T) # nos permite plotear encima con etiqueta ``` <img src="data:image/png;base64,#05_Tipos_datos_climaticos_files/figure-html/unnamed-chunk-20-1.png" width="100%" /> --- ## Extracción de información. **Extracción de valores de los pixeles** ``` r titulo <- paste("Histograma Precipitacion", names(mascara_crop[[6]])) # Titulo plot hist(mascara_crop[[6]], main=titulo) ``` <img src="data:image/png;base64,#05_Tipos_datos_climaticos_files/figure-html/unnamed-chunk-21-1.png" width="100%" /> --- ## Operaciones de extracción de información. **Extracción de valores de los pixeles** ``` r valores_elev <- values(mascara_crop) %>% na.omit # omitimos las celdas NA mean(valores_elev) ``` ``` ## [1] 34.7065 ``` ``` r median(valores_elev) ``` ``` ## [1] 10 ``` --- ## Operaciones de extracción de información. **EstadÃstica zonal**: Precipitacion promedio comunas de la provincia de ValparaÃso ``` r comunas_valpo <- vect("TuDirectorio/comunas_valpo.gpkg") provincia_valpo <- subset(comunas_valpo, comunas_valpo$NOM_PROV == "ValparaÃso") media_PP_comunas <- zonal(mascara_crop, provincia_valpo, fun="mean", touches=T, as.polygons = T) plot(media_PP_comunas, "1960-06-15", col = heat.colors(10)) ``` <img src="data:image/png;base64,#05_Tipos_datos_climaticos_files/figure-html/unnamed-chunk-24-1.png" width="100%" /> --- ## Operaciones de extracción de información. ``` r tabla_resultado <- as.data.frame(media_PP_comunas) ```
--- ## Operaciones de extracción de información. **EstadÃstica zonal**: Precipitacion promedio región de ValparaÃso ``` r media_PP_valpo <- zonal(mascara_crop, vector_valpo, fun="mean", touches=T, as.polygons = T) plot(media_PP_valpo, "1960-06-15", col = heat.colors(10)) ``` <img src="data:image/png;base64,#05_Tipos_datos_climaticos_files/figure-html/unnamed-chunk-27-1.png" width="100%" /> ``` r tabla_valpo <- as.data.frame(media_PP_valpo) ```
--- ## Operaciones de extracción de información. ``` r df <- data.frame(PP = as.numeric(tabla_valpo[,2:745]), fechas = names(mascara_crop) %>% as.Date()) ggplot(df, aes(x= fechas, y = PP)) + geom_col(col = "blue") ``` <img src="data:image/png;base64,#05_Tipos_datos_climaticos_files/figure-html/unnamed-chunk-30-1.png" width="100%" /> --- ### BibliografÃa 2022 Jerry Davis. Introduction to Environmental Data Science. Capitulo 8.Raster Spatial Analysis. https://bookdown.org/igisc/EnvDataSci/raster-spatial-analysis.html 2022 Robert J. Hijmans. terra.pdf. https://cran.r-project.org/web/packages/terra/terra.pdf 2012 Essentials of Geographic Information Systems. Chapter 8.Geospatial Analysis II: Raster Data. https://saylordotorg.github.io/text_essentials-of-geographic-information-systems/s12-geospatial-analysis-ii-raster-.html --- class: inverse middle 